package com.lrs.java.j2se_base.baseSyntax;

import com.lrs.java.j2se_base.baseSyntax.p1.TestProtected2;

public class TestProtected extends TestProtected2 implements Cloneable {
	private int prop;
	
	public int getProp() {
		return prop;
	}

	public void setProp(int prop) {
		this.prop = prop;
	}

	/**
	 * 1. 对与同一个包中的类，protected成员都是可见的
	 * 2. 两个类隶属于不同的包，
	 * 	  2.1  每个子类的类内部都可见父类中protected的成员
	 * 	  2.2  两个类都是Object的子类，一个子类中持有另一个子类引用，但不能通过该引用访问父类中protected的成员
	 *    2.3  一个类是另一个类的子类，子类中持有父类的引用，但不能通过该引用访问父类中的protected成员
	 *    ( 即在类的内部怎么调用父类的clone都没关系，但不容许在该类的外部通过类的引用来调用clone )
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		TestProtected p1 = new TestProtected();
		p1.prop = 1;
		
		//1. 继承Object的子类的类内部可以访问protected
		TestProtected p2 = (TestProtected)p1.clone();
		System.out.println(p2.prop);
		
		
		//2. 不能在一个子类中访问另一个子类的protected方法，尽管这两个子类继承自同一个父类。
		Test1 test = new Test1();
//		test.clone(); //complie error
		
		
		//3. Test2和TestProtected在同一个package中，所以可以访问protected方法。
		Test2 test2 = new Test2();
		test2.clone(); //compile OK
		
		
		//4.1 TestProtected2和TestProtected是在不同包中，调用TestProtected2对象的clone方法是不可见的
		TestProtected2 tp2 = new TestProtected2();
//		tp2.clone(); //compile error
		
		TestProtected tp1 = new TestProtected();
		tp1.clone(); // compile OK
		
		
		//4.2 通过Object对象访问Object对象的clone
		Object obj = new Object();
//		obj.clone(); //compile error
		
		
		
	}
	
}

class Test1 implements Cloneable{
	
}

class Test2 implements Cloneable{

	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	
}

